import requests
import hashlib
import time
from BloodSpiderModel.spider_tools import common_utils





class DaiLianTong:
    def __init__(self):
        self.user_id = "24118112"
        # 代练通基础url
        self.dailiantong_base_url = "https://server.dailiantong.com.cn/API/AppService.ashx"
        # 基础 data 参数
        self.base_data = {
            'IsPub': '1',
            'GameID': '107',
            'ZoneID': '0',
            'ServerID': '0',
            'SearchStr': '',
            'STier': '',
            'ETier': '',
            'Sort_Str': '',
            'PageIndex': '1',
            'PageSize': '20',
            'Price_Str': '',
            'PubCancel': '0',
            'SettleHour': '0',
            'FilterType': '0',
            'PGType': '0',
            'Focused': '-1',
            'OrderType': '0',
            'PubRecommend': '0',
            'Score1': '0',
            'Score2': '0',
            'UserID': self.user_id,
            'TimeStamp': str(int(time.time())),
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        self.spider_common_utils = common_utils.GeneralToolkit()
        self.headers = self.spider_common_utils.get_headers(ua_device_type="mobile")
        self.headers["Referer"] = 'https://m.dailiantong.com/'
        self.headers["Origin"] = 'https://m.dailiantong.com'


    def get_dict_values(self, input_dict):
        """
        从字典中提取所有值并返回一个列表

        参数:
            input_dict: 输入的字典

        返回:
            list: 包含字典中所有值的列表
        """
        # 检查输入是否为字典类型
        if not isinstance(input_dict, dict):
            raise TypeError("输入必须是一个字典")

        # 提取字典中的所有值并返回列表
        return list(input_dict.values())

    # 加密参数
    def md5_encrypt(self, params, e="LevelOrderList",  Token="F7E409A42D324E789BF71FF3538A3481",
                    SignKey="9c7b9399680658d308691f2acad58c0a"):
        """
        对输入字符串进行MD5加密，返回小写的32位加密结果

        参数:
            input_str: 需要加密的字符串

        返回:
            str: 小写的32位MD5加密结果
        """
        input_str = "".join(SignKey + e + "".join(self.get_dict_values(params)) + Token)
        # 创建md5对象
        md5_obj = hashlib.md5()

        # 如果输入不是bytes类型，需要先编码
        if isinstance(input_str, str):
            input_str = input_str.encode('utf-8')

        # 更新md5对象
        md5_obj.update(input_str)

        # 获取加密结果并返回小写的32位十六进制字符串
        return md5_obj.hexdigest()



    # 获取订单列表
    def get_order_list(self, price_str=""):
        """
        Price_Str: 价格范围，格式为"12_50"
        """
        params = {
            'Action': 'LevelOrderList',
        }

        if price_str == "":
            price_str = "1_20"

        data = self.base_data.copy()
        data["Price_Str"] = price_str
        data["Sign"] = self.md5_encrypt(data)

        response = requests.post(self.dailiantong_base_url, params=params,
                                 headers=self.headers, data=data).json()

        return response

    
    # 查询订单是否存在
    def check_order_exists(self, order_id):
        if not order_id:
            return None
        params = {
        'Action': 'LevelOrderList',
        }

        data = self.base_data.copy()
        data["SearchStr"] = order_id
        data["IsPub"] = "0"
        data["UserID"] = "20751898"
        data["Sign"] = self.md5_encrypt(data, Token="40458243CD3542AAB0C4AD1F02F02626")

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None
        

    def ansi_md5(self, data):
        """
        计算数据的 MD5 哈希值，返回原始二进制字节串
        :param data: 输入数据（字符串需先编码为字节）
        :return: 16字节的二进制 MD5 哈希
        """
        # 创建 MD5 哈希对象
        md5_hash = hashlib.md5()
        # 更新哈希对象（注意：必须传入字节类型，字符串需先编码）
        if isinstance(data, str):
            data = data.encode('utf-8')  # 通常使用 UTF-8 编码
        md5_hash.update(data)
        # 返回原始二进制哈希值（16字节）
        return md5_hash.digest()
  
  
    # 加密支付密码
    def encrypt_payment_password(self, password):
        """
        对支付密码进行MD5加密

        参数:
            password: 原始支付密码

        返回:
            str: 加密后的支付密码
        """
        n = "USR2025092602816"
        md5_obj = hashlib.md5()
        if isinstance(password, str):
            password = password.encode('utf-8')
        md5_obj.update(password)
        md5_obj = md5_obj.hexdigest()

        return self.ansi_md5(md5_obj + n).hex()

    
    # 验证密码是否正确
    def verify_payment_password(self, payment_password):
        params = {
            'Action': 'VerifyPayPass',
        }

        data = {
            "PayPass": self.encrypt_payment_password(payment_password),
            'UserID': self.user_id,
            'TimeStamp': "1759027433",
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        data["Sign"] = self.md5_encrypt(data, e=params["Action"])

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None
        
    # 获取订单详情
    def get_order_detail(self, order_id):
        params = {
            'Action': 'LevelOrderDetail',
        }

        data = {
            'ODSerialNo': order_id,
            'IsPublish': '2',
            'UserID': self.user_id,
            'TimeStamp': str(int(time.time())),
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        data["Sign"] = self.md5_encrypt(data, e=params["Action"])

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None

    # 接收订单
    def receive_order(self, order_id, payment_password):

        # 订单详情
        order_detail = self.get_order_detail(order_id)
        if order_detail is None:
            return None
        params = {
            'Action': 'NewLevelOrderAccept',
        }
        
        data = {
            'ODSerialNo': order_id,
            'Stamp': str(order_detail["Stamp"]),
            'PayPass': self.encrypt_payment_password(payment_password),
            'Insurance': '0',
            'MaxClaimAmount': '0',
            'VisitType': '0',
            'NonceStr': '',
            'NoEnsure': '0',
            'IsWx': '0',
            'SourceType': '0',
            'UserID': self.user_id,
            'TimeStamp': str(int(time.time())),
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        data["Sign"] = self.md5_encrypt(data, e=params["Action"])

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None

    # 获取订单及号主信息
    def get_order_and_player_info(self, order_id):
        params = {
            'Action': 'LevelOrderDetail',
        }

        data = {
            'ODSerialNo': order_id,
            'IsPublish': '0',
            'UserID': self.user_id,
            'TimeStamp': str(int(time.time())),
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        data["Sign"] = self.md5_encrypt(data, e=params["Action"])   

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None

    # 获取我的个人信息
    def get_my_info(self):
        params = {
            'Action': 'UserInfoList',
        }

        data = {
            'UserID': self.user_id,
            'TimeStamp': str(int(time.time())),
            'Ver': '1.0',
            'AppVer': '5.1.3',
            'AppOS': 'WebApp IOS',
            'AppID': 'webapp',
        }
        data["Sign"] = self.md5_encrypt(data, e=params["Action"])

        response = requests.post(self.dailiantong_base_url, params=params, headers=self.headers, data=data)
        if response.status_code == 200:
            return response.json()
        else:
            return None


if __name__ == "__main__":
    dailiantong = DaiLianTong()
    print(dailiantong.receive_order("10718006461551723966", "128524"))
